GitHub Actions, JIRA API, Confluence API를 활용하여 개발 프로세스를 전면 자동화한 경험을 공유합니다. PR 자동 할당, JIRA 티켓 상태 자동 업데이트, 데일리 리포트 자동 생성으로 개발 생산성을 크게 향상시켰습니다.

📊 프로젝트 개요

목표

  • PR 처리 시간 50% 단축
  • 개발 프로세스 자동화 구현
  • JIRA 티켓과 GitHub PR 연동
  • 데일리 업무 리포트 자동 생성

핵심 성과

  • ✅ PR 기본 정보 자동화 (어싸이니, 리뷰어, 라벨)
  • ✅ JIRA 티켓 상태 자동 업데이트 (진행중 → 해결)
  • ✅ OSS PR 연동 시 티켓 상태 자동 변경
  • ✅ 데일리 리포트 자동 생성 (주간보고, 배포 현황, 티켓 브리핑, 코드리뷰)
  • ✅ 개발 시간 절약 및 프로세스 일관성 확보

🔴 문제 상황

1. 수동 작업의 반복성

문제:

  • PR 생성 시마다 어싸이니, 리뷰어, 라벨을 수동으로 설정해야 함
  • JIRA 티켓 상태를 수동으로 업데이트해야 함
  • 매일 반복되는 업무 정보 수집 작업 (주간보고, 배포 현황, 티켓 상태 등)

영향:

  • 개발 시간 낭비
  • 실수로 인한 누락 가능성
  • 일관성 없는 프로세스

2. PR과 JIRA 티켓 연동 부재

문제:

  • PR이 생성되어도 JIRA 티켓 상태가 자동으로 변경되지 않음
  • PR이 머지되어도 티켓 상태가 자동으로 업데이트되지 않음
  • 티켓 상태를 수동으로 확인하고 업데이트해야 함

영향:

  • 프로젝트 진행 상황 파악 어려움
  • 티켓 상태와 실제 진행 상황 불일치

3. 업무 정보 수집의 비효율성

문제:

  • 매일 주간보고, 배포 현황, 티켓 상태를 수동으로 확인해야 함
  • 여러 시스템(Confluence, JIRA, GitHub)을 오가며 정보 수집
  • 정보가 분산되어 있어 한눈에 파악하기 어려움

영향:

  • 업무 시작 전 정보 수집에 시간 소요
  • 중요한 정보 누락 가능성

✅ 해결 방법

1. PR 자동화 시스템

1.1 PR 기본 정보 자동화

구현 내용:

  • PR 생성 시 자동으로 어싸이니, 리뷰어, 라벨 할당
  • 커밋명에서 티켓 키 추출
  • 티켓 정보를 기반으로 자동 설정

효과:

  • ✅ PR 생성 시 자동으로 기본 정보 설정
  • ✅ 티켓 정보 기반 일관된 설정
  • ✅ 수동 작업 시간 절약

2. JIRA-OSS 연동 시스템

2.1 JIRA 티켓 상태 자동 업데이트

구현 내용:

  • 브랜치 푸시 시 티켓 상태를 "진행중"으로 자동 변경
  • PR 생성 시 티켓 상태를 "리뷰중"으로 자동 변경
  • PR 머지 시 티켓 상태를 "컨펌"으로 자동 변경
  • 배포 시 티켓 상태를 "완료"으로 자동 변경
  • 닫힘 상태 티켓 변경 방지 로직

효과:

  • ✅ 브랜치 푸시 시 자동으로 티켓 상태 "진행중"으로 변경
  • ✅ PR 생성 시 자동으로 티켓 상태 "리뷰중"으로 변경
  • ✅ PR 머지 시 자동으로 티켓 상태 "컨펌"으로 변경
  • ✅ 배포 시 자동으로 티켓 상태 "완료"로 변경
  • ✅ 닫힘 상태 티켓 변경 방지로 데이터 무결성 보장

3. 대시보드 시스템 구축

3.1 데일리 리포트 자동 생성

구현 내용:

  • 매일 반복되는 업무 정보를 자동으로 수집하여 Obsidian 마크다운 파일 생성
  • Confluence, JIRA, GitHub API를 직접 호출하여 데이터 수집
  • 순수 JavaScript로 구현하여 의존성 없음

주요 기능:

1. 주간보고 데이터 수집

// 위키 페이지 수집
async function getWeeklyReportPages() {
  const pages = await confluenceAPI.getChildrenPages(PARENT_PAGE_ID)

  // 필터링: 이윤희 관련 + 오늘 이후 날짜
  const filteredPages = pages.filter((page) => {
    const hasUserName = page.title.includes('이윤희')
    const hasFutureDate = extractDate(page.title) >= today
    return hasUserName && hasFutureDate
  })

  return filteredPages
}

// Jira 티켓 수집
async function getWeeklyReportTickets() {
  const jql = `assignee = "KR22913" AND updated >= "지난목요일" AND updated <= "오늘 23:59"`
  const tickets = await jiraAPI.searchIssues(jql)

  return tickets.sort((a, b) => new Date(b.updated) - new Date(a.updated))
}

2. 배포 현황 데이터 수집

// 정기배포 티켓 조회
async function getRegularDeploymentTickets(deploymentDate) {
  const dateStr = formatDate(deploymentDate, 'yyMMdd') // 예: 251112
  const fixVersion = `RB_${dateStr}_쇼핑버티컬웹개발`

  const jql = `assignee = KR22913 AND fixVersion = ${fixVersion}`
  return await jiraAPI.searchIssues(jql)
}

// 비정기배포 티켓 조회
async function getIrregularDeploymentTickets(deploymentDate) {
  const dateStr = formatDate(deploymentDate, 'yyMMdd')
  const fixVersion = `HF_${dateStr}_쇼핑버티컬웹개발`

  const jql = `assignee = KR22913 AND fixVersion = ${fixVersion}`
  return await jiraAPI.searchIssues(jql)
}

3. 지라 티켓 브리핑

// 오픈 스프린트 티켓 조회
async function getSprintTickets() {
  const jql = `sprint in openSprints() AND assignee = "KR22913" ORDER BY status ASC, updated DESC`
  const tickets = await jiraAPI.searchIssues(jql)

  // 상태별 그룹화
  const grouped = groupByStatus(tickets, [
    '리뷰 중',
    '진행 중',
    '보류',
    '할 일',
    '등록',
    '해결',
    '닫힘',
  ])

  return grouped
}

4. 코드리뷰 알림

// 내가 만든 PR
async function getMyPRs() {
  const query = `author:${username} is:pr is:open`
  return await githubAPI.searchPullRequests(query)
}

// 내가 리뷰어인 PR
async function getPRsWhereIAmReviewer() {
  const queries = [
    `review-requested:${username} is:pr is:open`,
    `reviewed-by:${username} is:pr is:open`,
  ]

  // 팀 리뷰 요청 포함
  const teams = await githubAPI.getUserTeams(username)
  teams.forEach((team) => {
    queries.push(`review-requested:${team} is:pr is:open`)
  })

  return await Promise.all(
    queries.map((query) => githubAPI.searchPullRequests(query))
  ).then((results) => results.flat())
}

효과:

  • ✅ 매일 반복되는 정보 수집 작업 자동화
  • ✅ 여러 시스템을 한눈에 파악 가능
  • ✅ 중요한 정보 누락 방지
  • ✅ 업무 시작 전 빠른 브리핑

🏗️ 전체 아키텍처

자동화 흐름

브랜치 푸시
JIRA 상태 자동 업데이트 (진행중)
PR 생성
GitHub Actions 트리거
┌─────────────────┬──────────────────────────┬─────────────────┐
│ PR 기본 정보    │ JIRA 상태 자동 업데이트   │ 리뷰어 할당     │
│ 자동 설정       │ (리뷰중)                  │                 │
└─────────────────┴──────────────────────────┴─────────────────┘
PR 머지
JIRA 상태 자동 업데이트 (컨펌)
배포
JIRA 상태 자동 업데이트 (완료)
QA 확인
JIRA 상태 업데이트 (닫힘)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
매일 자동 실행 (데일리 리포트)
Confluence API → 주간보고 데이터
JIRA API → 티켓 브리핑, 배포 현황
GitHub API → 코드리뷰 알림
Obsidian 마크다운 파일 생성

📈 개선 효과

정량적 성과

항목 Before After 개선
PR 처리 시간 수동 설정 필요 자동화 50% 단축
티켓 상태 업데이트 수동 자동 100% 자동화
데일리 리포트 생성 수동 수집 (30분) 자동 생성 (1분) 97% 시간 절약
정보 수집 시간 30분/일 1분/일 97% 감소

정성적 성과

  • ✅ 개발 프로세스 일관성 확보
  • ✅ 실수로 인한 누락 방지
  • ✅ 개발자 생산성 향상
  • ✅ 프로젝트 진행 상황 가시성 향상
  • ✅ 업무 시작 전 빠른 브리핑 가능

💡 핵심 교훈

1. 자동화는 점진적으로 확장해야 함

처음에는 기본적인 기능부터 시작하고, 점진적으로 고도화하는 것이 좋습니다. 한 번에 모든 것을 자동화하려고 하면 복잡도가 높아질 수 있습니다.

2. 에러 처리와 Fallback 로직이 중요함

JIRA API 호출 실패, 티켓 키 추출 실패 등 다양한 예외 상황을 고려해야 합니다. 자동화가 실패해도 수동으로 처리할 수 있는 Fallback 로직이 필요합니다.

3. 팀의 워크플로우를 이해해야 함

각 팀마다 다른 워크플로우가 있으므로, 팀의 실제 프로세스를 이해하고 그에 맞게 자동화를 설계해야 합니다.

4. 보안을 고려해야 함

JIRA API 토큰, GitHub 토큰 등 민감한 정보는 GitHub Secrets로 관리하고, 최소 권한 원칙을 적용해야 합니다.

5. 모니터링과 로깅이 필요함

자동화가 제대로 동작하는지 모니터링하고, 실패 시 로그를 확인할 수 있어야 합니다.

6. Rate Limit 처리

API 호출 시 Rate Limit을 고려하여 Retry-After 헤더 기반 자동 재시도 로직을 구현해야 합니다.


🎯 결론

개발 프로세스 자동화 구축을 통해 다음과 같은 성과를 달성했습니다:

  1. PR 처리 시간 50% 단축: 자동화로 수동 작업 시간 절약
  2. JIRA 티켓 상태 자동 업데이트: PR과 티켓 연동으로 프로젝트 진행 상황 가시성 향상
  3. 데일리 리포트 자동 생성: 매일 반복되는 정보 수집 작업 자동화로 97% 시간 절약
  4. 일관된 프로세스: 자동화로 일관된 워크플로우 확보
  5. 개발자 생산성 향상: 반복 작업 자동화로 개발에 집중 가능

이번 작업을 통해 개발 프로세스 자동화의 중요성을 깨달았고, GitHub Actions, JIRA API, Confluence API 연동 경험을 쌓을 수 있었습니다. 특히 데일리 리포트 자동화는 개인 생산성 향상에 큰 도움이 되었습니다.


📚 참고 자료